{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# CNN 图像分类模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.0.0\n",
      "sys.version_info(major=3, minor=6, micro=10, releaselevel='final', serial=0)\n",
      "matplotlib 3.1.2\n",
      "numpy 1.18.1\n",
      "pandas 0.25.3\n",
      "sklearn 0.22.1\n",
      "tensorflow 2.0.0\n",
      "tensorflow_core.keras 2.2.4-tf\n"
     ]
    }
   ],
   "source": [
    "# 导入\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "\n",
    "print(tf.__version__)\n",
    "print(sys.version_info)\n",
    "for module in mpl,np,pd,sklearn,tf,keras:\n",
    "    print(module.__name__,module.__version__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 Physical GPUs, 1 Logical GPUs\n"
     ]
    }
   ],
   "source": [
    "# physical_devices = tf.config.experimental.list_physical_devices('GPU')\n",
    "# assert len(physical_devices) > 0, \"Not enough GPU hardware devices available\"\n",
    "# tf.config.experimental.set_memory_growth(physical_devices[0], True)\n",
    "\n",
    "def solve_cudnn_error():\n",
    "    gpus = tf.config.experimental.list_physical_devices('GPU')\n",
    "    if gpus:\n",
    "        try:\n",
    "            # Currently, memory growth needs to be the same across GPUs\n",
    "            for gpu in gpus:\n",
    "                tf.config.experimental.set_memory_growth(gpu, True)\n",
    "            logical_gpus = tf.config.experimental.list_logical_devices('GPU')\n",
    "            print(len(gpus), \"Physical GPUs,\", len(logical_gpus), \"Logical GPUs\")\n",
    "        except RuntimeError as e:\n",
    "            # Memory growth must be set before GPUs have been initialized\n",
    "            print(e)\n",
    "\n",
    "solve_cudnn_error()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据读取"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(5000, 28, 28) (5000,)\n",
      "(55000, 28, 28) (55000,)\n",
      "(10000, 28, 28) (10000,)\n"
     ]
    }
   ],
   "source": [
    "# # 导入数据集fashion mnist\n",
    "fashion_mnist = keras.datasets.fashion_mnist\n",
    "(x_train_all,y_train_all),(x_test,y_test) = fashion_mnist.load_data()\n",
    "x_valid,x_train = x_train_all[:5000],x_train_all[5000:]\n",
    "y_valid,y_train = y_train_all[:5000],y_train_all[5000:]\n",
    "\n",
    "print(x_valid.shape,y_valid.shape)\n",
    "print(x_train.shape,y_train.shape)\n",
    "print(x_test.shape,y_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据归一化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "scaler = StandardScaler()\n",
    "x_train_scaled = scaler.fit_transform(\n",
    "    x_train.astype(np.float32).reshape(-1,1)).reshape(-1,28,28,1)\n",
    "x_valid_scaled = scaler.transform(\n",
    "    x_valid.astype(np.float32).reshape(-1,1)).reshape(-1,28,28,1)\n",
    "x_test_scaled = scaler.transform(\n",
    "    x_test.astype(np.float32).reshape(-1,1)).reshape(-1,28,28,1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## CNN模型搭建"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential()\n",
    "# 构建模型\n",
    "model.add(keras.layers.Conv2D(filters=32, kernel_size=3, padding='same',\n",
    "                              activation='relu', input_shape=(28,28,1)))\n",
    "model.add(keras.layers.Conv2D(filters=32, kernel_size=3, padding='same', activation='relu'))\n",
    "model.add(keras.layers.MaxPool2D(pool_size=2))\n",
    "\n",
    "model.add(keras.layers.Conv2D(filters=64, kernel_size=3, padding='same', activation='relu'))\n",
    "model.add(keras.layers.Conv2D(filters=64, kernel_size=3, padding='same', activation='relu'))\n",
    "model.add(keras.layers.MaxPool2D(pool_size=2))\n",
    "\n",
    "model.add(keras.layers.Conv2D(filters=128, kernel_size=3, padding='same', activation='relu'))\n",
    "model.add(keras.layers.Conv2D(filters=128, kernel_size=3, padding='same', activation='relu'))\n",
    "model.add(keras.layers.MaxPool2D(pool_size=2))\n",
    "\n",
    "model.add(keras.layers.Flatten())\n",
    "model.add(keras.layers.Dense(128, activation='relu'))\n",
    "model.add(keras.layers.Dense(10, activation='softmax'))\n",
    "\n",
    "# 模型编译，固化模型\n",
    "model.compile(loss='sparse_categorical_crossentropy',\n",
    "              optimizer='adam',\n",
    "              metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d (Conv2D)              (None, 28, 28, 32)        320       \n",
      "_________________________________________________________________\n",
      "conv2d_1 (Conv2D)            (None, 28, 28, 32)        9248      \n",
      "_________________________________________________________________\n",
      "max_pooling2d (MaxPooling2D) (None, 14, 14, 32)        0         \n",
      "_________________________________________________________________\n",
      "conv2d_2 (Conv2D)            (None, 14, 14, 64)        18496     \n",
      "_________________________________________________________________\n",
      "conv2d_3 (Conv2D)            (None, 14, 14, 64)        36928     \n",
      "_________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2 (None, 7, 7, 64)          0         \n",
      "_________________________________________________________________\n",
      "conv2d_4 (Conv2D)            (None, 7, 7, 128)         73856     \n",
      "_________________________________________________________________\n",
      "conv2d_5 (Conv2D)            (None, 7, 7, 128)         147584    \n",
      "_________________________________________________________________\n",
      "max_pooling2d_2 (MaxPooling2 (None, 3, 3, 128)         0         \n",
      "_________________________________________________________________\n",
      "flatten (Flatten)            (None, 1152)              0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 128)               147584    \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 10)                1290      \n",
      "=================================================================\n",
      "Total params: 435,306\n",
      "Trainable params: 435,306\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/10\n",
      "55000/55000 [==============================] - 40s 731us/sample - loss: 0.4236 - accuracy: 0.8439 - val_loss: 0.3182 - val_accuracy: 0.8824\n",
      "Epoch 2/10\n",
      "55000/55000 [==============================] - 31s 557us/sample - loss: 0.2629 - accuracy: 0.9041 - val_loss: 0.2360 - val_accuracy: 0.9112\n",
      "Epoch 3/10\n",
      "55000/55000 [==============================] - 30s 554us/sample - loss: 0.2190 - accuracy: 0.9208 - val_loss: 0.2279 - val_accuracy: 0.9156\n",
      "Epoch 4/10\n",
      "55000/55000 [==============================] - 31s 555us/sample - loss: 0.1893 - accuracy: 0.9302 - val_loss: 0.2431 - val_accuracy: 0.9114\n",
      "Epoch 5/10\n",
      "55000/55000 [==============================] - 31s 555us/sample - loss: 0.1676 - accuracy: 0.9385 - val_loss: 0.2214 - val_accuracy: 0.9202\n",
      "Epoch 6/10\n",
      "55000/55000 [==============================] - 31s 556us/sample - loss: 0.1457 - accuracy: 0.9458 - val_loss: 0.2183 - val_accuracy: 0.9194\n",
      "Epoch 7/10\n",
      "55000/55000 [==============================] - 31s 557us/sample - loss: 0.1284 - accuracy: 0.9522 - val_loss: 0.2195 - val_accuracy: 0.9264\n",
      "Epoch 8/10\n",
      "55000/55000 [==============================] - 31s 556us/sample - loss: 0.1159 - accuracy: 0.9563 - val_loss: 0.2285 - val_accuracy: 0.9244\n",
      "Epoch 9/10\n",
      "55000/55000 [==============================] - 31s 559us/sample - loss: 0.1040 - accuracy: 0.9613 - val_loss: 0.2546 - val_accuracy: 0.9270\n",
      "Epoch 10/10\n",
      "55000/55000 [==============================] - 31s 557us/sample - loss: 0.0981 - accuracy: 0.9634 - val_loss: 0.2455 - val_accuracy: 0.9232\n"
     ]
    }
   ],
   "source": [
    "# 定义文件夹和文件\n",
    "logdir = os.path.join('cnn-models')\n",
    "if not os.path.exists(logdir):\n",
    "    os.mkdir(logdir)\n",
    "output_model_file = os.path.join(logdir,'fashion_mnist_model.h5')\n",
    "\n",
    "# 定义回调函数\n",
    "callbacks = [\n",
    "    keras.callbacks.TensorBoard(log_dir=logdir,profile_batch = 100000000),\n",
    "    keras.callbacks.ModelCheckpoint(output_model_file,save_best_only=True),\n",
    "    keras.callbacks.EarlyStopping(patience=5,min_delta=1e-3),\n",
    "]\n",
    "\n",
    "# 训练\n",
    "history = model.fit(x_train_scaled,y_train,epochs=10,\n",
    "                    validation_data=(x_valid_scaled,y_valid),\n",
    "                    callbacks=callbacks)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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6AhERKQ4v/wsvPVCZrU2EYfwME8n7z8Pzvi3QZt997vfZenSpQC8+eabLF68mEWLFjFjxgwAxo8fD8BDDz3Evffem9muqalp0H2fc845ma8Y3bZtGxdffDGvvPIKZkYsFsvs94orrsicPk+/3kUXXcSPfvQjLrnkEh577DHuvPPOYkc+Kgb913L3Ryn83nR2Gwc+PkDdg6RCXURE9kGtra089NBDPPbYY9TV1dHS0sKCBQt4+eWX+7V1d1IneHNll3V3d+fU1dfXZ5a/8IUvcNJJJ7F06VJee+01WlpadrnfSy65hPe///3U1NRwzjnnlPx74qXdOxERGTl5M+KuvfTVnNu2baOpqYm6ujpeeuklHn/8cXp6enjkkUd49dVXM6fHx48fz6mnnsr3vvc9/v3f/x1InR5vampi0qRJrFy5kpkzZ7J06dIB+71t2zamTk19SOn222/PlJ966qncfPPNtLS0ZE6Pjx8/nilTpjBlyhS++tWv8tvf/naP/yyGS7cxFRGRPer0008nHo8zf/58vvCFL3D88cczceJEFi9ezIc//GEWLFjAueeeC8DnP/95tmzZwty5c1mwYAEPP/wwAP/2b//GmWeeycknn8zkyZMHfK1//ud/5tprr+Vd73oXiUQiU37ppZdy4IEHMn/+fBYsWMDdd9+dqbvwwgs54IADmD279O/9pZm2iIjsUdXV1fzyl78sWHfGGWfkrDc0NHDHHXf0a3f22Wdz9tln9yu/+eabc2bdJ5xwAqtWrcqsf+UrXwEgEonw7W9/m29/u//11I8++iiXXXZZcYMZZQptERHZZx199NHU19fzrW99a7S7UhSFtoiI7LOeeeaZ0e7CkOg9bRERkTKh0BYRESkTCm0REZEyodAWEREpEwptERGRMqHQFhGRktHQ0DBg3WuvvcbcuXP3Ym9Kj0JbRESkTCi0RURkj/nMZz7D97///cz6DTfcwJe+9CVOOeUUjjrqKObNm8fPfvazIe+3u7ubSy65hOOPP54jjzwyc7vTFStWsHDhQo444gjmz5/PK6+8QmdnJ+973/tYsGABc+fO5cc//vGIjW9v081VRET2EV9/8uu8tPmlzHoikch8peXumjV+Fp9Z+JkB68877zw+9alP8bGPfQyAJUuW8Ktf/Yqrr76asWPHsmnTJo4//ng+8IEPFPwWroHcdNNNADz+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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画图展示学习曲线图\n",
    "def plot_learning_curves(history):\n",
    "    pd.DataFrame(history.history).plot(figsize=(8,5))\n",
    "    plt.grid(True)\n",
    "    plt.gca().set_ylim(0, 1)\n",
    "    plt.show()\n",
    "    \n",
    "plot_learning_curves(history)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "model.evaluate(x_test_scaled, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 更改激活函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential()\n",
    "# 构建模型\n",
    "model.add(keras.layers.Conv2D(filters=32, kernel_size=3, padding='same',\n",
    "                              activation='selu', input_shape=(28,28,1)))\n",
    "model.add(keras.layers.Conv2D(filters=32, kernel_size=3, padding='same', activation='selu'))\n",
    "model.add(keras.layers.MaxPool2D(pool_size=2))\n",
    "\n",
    "model.add(keras.layers.Conv2D(filters=64, kernel_size=3, padding='same', activation='selu'))\n",
    "model.add(keras.layers.Conv2D(filters=64, kernel_size=3, padding='same', activation='selu'))\n",
    "model.add(keras.layers.MaxPool2D(pool_size=2))\n",
    "\n",
    "model.add(keras.layers.Conv2D(filters=128, kernel_size=3, padding='same', activation='selu'))\n",
    "model.add(keras.layers.Conv2D(filters=128, kernel_size=3, padding='same', activation='selu'))\n",
    "model.add(keras.layers.MaxPool2D(pool_size=2))\n",
    "\n",
    "model.add(keras.layers.Flatten())\n",
    "model.add(keras.layers.Dense(128, activation='selu'))\n",
    "model.add(keras.layers.Dense(10, activation='softmax'))\n",
    "\n",
    "# 模型编译，固化模型\n",
    "model.compile(loss='sparse_categorical_crossentropy',\n",
    "              optimizer='adam',\n",
    "              metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/10\n",
      "55000/55000 [==============================] - 53s 959us/sample - loss: 0.4177 - accuracy: 0.8509 - val_loss: 0.3158 - val_accuracy: 0.8884\n",
      "Epoch 2/10\n",
      "55000/55000 [==============================] - 52s 941us/sample - loss: 0.3110 - accuracy: 0.8875 - val_loss: 0.2900 - val_accuracy: 0.8982\n",
      "Epoch 3/10\n",
      "55000/55000 [==============================] - 51s 934us/sample - loss: 0.2899 - accuracy: 0.8948 - val_loss: 0.3436 - val_accuracy: 0.8820\n",
      "Epoch 4/10\n",
      "55000/55000 [==============================] - 51s 936us/sample - loss: 0.2564 - accuracy: 0.9086 - val_loss: 0.2628 - val_accuracy: 0.9050\n",
      "Epoch 5/10\n",
      "55000/55000 [==============================] - 51s 933us/sample - loss: 0.2445 - accuracy: 0.9122 - val_loss: 0.2742 - val_accuracy: 0.9028\n",
      "Epoch 6/10\n",
      "55000/55000 [==============================] - 51s 933us/sample - loss: 0.2282 - accuracy: 0.9182 - val_loss: 0.2624 - val_accuracy: 0.9100\n",
      "Epoch 7/10\n",
      "55000/55000 [==============================] - 52s 937us/sample - loss: 0.2100 - accuracy: 0.9250 - val_loss: 0.3109 - val_accuracy: 0.9064\n",
      "Epoch 8/10\n",
      "55000/55000 [==============================] - 52s 943us/sample - loss: 0.4636 - accuracy: 0.8509 - val_loss: 0.3674 - val_accuracy: 0.8870\n",
      "Epoch 9/10\n",
      "55000/55000 [==============================] - 52s 940us/sample - loss: 0.2230 - accuracy: 0.9201 - val_loss: 0.2455 - val_accuracy: 0.9152\n",
      "Epoch 10/10\n",
      "55000/55000 [==============================] - 51s 933us/sample - loss: 0.2062 - accuracy: 0.9267 - val_loss: 0.2884 - val_accuracy: 0.9052\n"
     ]
    }
   ],
   "source": [
    "# 定义文件夹和文件\n",
    "logdir = os.path.join('cnn-selu-models')\n",
    "if not os.path.exists(logdir):\n",
    "    os.mkdir(logdir)\n",
    "output_model_file = os.path.join(logdir,'fashion_mnist_model.h5')\n",
    "\n",
    "# 定义回调函数\n",
    "callbacks = [\n",
    "    keras.callbacks.TensorBoard(log_dir=logdir,profile_batch = 100000000),\n",
    "    keras.callbacks.ModelCheckpoint(output_model_file,save_best_only=True),\n",
    "    keras.callbacks.EarlyStopping(patience=5,min_delta=1e-3),\n",
    "]\n",
    "\n",
    "# 训练\n",
    "history_selu = model.fit(x_train_scaled,y_train,epochs=10,\n",
    "                         validation_data=(x_valid_scaled,y_valid),\n",
    "                         callbacks=callbacks)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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ugM8aK1d0aMtEBGR7nn+O7BlWWo2Ox4D5yCHkwdPgLN/3GWxX/7ylyxYsACADRs2MG/ePKZPn86IESMAyM/PB2DhwoU8/vjjqe0GDRrU5b4vvvji1C1G9+zZw9y5c/n4448xxhCNRlP7ve6661LD582vd+WVV/L73/+eq666itdff51HHnmkuy3vFV3+tqy1r9LxZ9PpZSzw9U7WPYcb6iIicgSqqqpi4cKFvP766+Tk5FBZWcmkSZP46KOP2pW11uIO8LaWvqyxsbHVumAwmJq+5ZZbmDlzJgsWLGDdunVUVlbuc79XXXUV559/PllZWVx88cV9/jPxvl07ERHpOW16xA2H6dace/bsYdCgQeTk5PDhhx/yxhtv0NTUxOLFi/n0009Tw+P5+fnMnj2bX/3qV/z85z8H3OHxQYMGUVJSwqpVqxgzZgwLFizotN579uxhyBD3S0oPPfRQavns2bO5//77qaysTA2P5+fnU1ZWRllZGXfccQcvv/zyIf9ZHCxdxlRERA6ps846i1gsxsSJE7nllls4+eSTKSoqYt68eXzxi19k0qRJXHLJJQB873vfY9euXYwfP55JkyaxaNEiAH784x9z3nnnMWvWLEpLSzt9rf/4j//gpptuYtq0acTj8dTyq6++mqFDhzJx4kQmTZrEY489llp3+eWXU1FRwdixff/aX+ppi4jIIRUIBHj++ec7XHf22We3mg+FQjz88MPtyl100UVcdNFF7Zbff//9rXrdp5xyCqtXr07N33777QB4vV7uuece7rmn/fnUr776Ktdcc033GtPLFNoiInLEmjJlCsFgkJ/+9Ke9XZVuUWiLiMgRa+nSpb1dhf2iz7RFREQyhEJbREQkQyi0RUREMoRCW0REJEMotEVERDKEQltERPqMUCjU6bp169Yxfvz4w1ibvkehLSIikiEU2iIicsh8+9vf5r777kvN33bbbfzgBz/gjDPO4Pjjj2fChAk89dRT+73fxsZGrrrqKk4++WQmT56cutzpihUrmDp1KscddxwTJ07k448/pq6ujnPPPZdJkyYxfvx4nnjiiR5r3+Gmi6uIiBwhfvLWT/hw54ep+Xg8nrql5YE6Jv8Yvj31252uv/TSS/m3f/s3vva1rwEwf/58XnjhBW688UYGDBjAjh07OPnkk7ngggs6vAtXZ+69914A3njjDTZu3Mjs2bNZvXo1999/P//6r//K5ZdfTiQSIR6P89xzz1FWVsZf/vIXwL2pSKZST1tERA6ZyZMns23bNjZt2sT777/PoEGDKC0t5eabb2bixIl87nOfY+PGjWzdunW/9vvqq69y5ZVXAnDMMccwbNgwVq9ezSmnnMKPfvQjfvKTn7B+/Xqys7OZMGECCxcu5Nvf/javvPIKeXl5h6Kph4V62iIiR4i2PeLaw3Rrzosuuognn3ySLVu2cOmll/Loo4+yfft2li5dis/nY/jw4e3ukd0Va22Hy7/85S9z0kkn8Ze//IUzzzyT3/zmN8yaNYulS5fy3HPPcdNNNzF79mxuvfXWnmjaYafQFhGRQ+rSSy/lmmuuYceOHSxevJj58+dTXFyMz+dj0aJFrF+/fr/3OX36dB599FFOPPFEVq9ezWeffcaYMWNYu3YtI0eO5IYbbmDt2rV88MEHHHPMMeTn53PFFVcQCoVa3Wc70yi0RUTkkBo3bhy1tbUMGTKE0tJSLr/8cs4//3xOOOEEjjvuOI455pj93ufXvvY1rrvuOk4++WT8fj8PPfQQgUCAJ554gt///vf4fD4GDx7Mrbfeyttvv823vvUtPB4PPp+PX//614eglYeHQltERA65ZcuWpaYLCwt5/fXXOywXDoc73cfw4cNZvnw5AFlZWTz00EPthvhvuukmbrrpplbbnXnmmZx55pkHU/0+QyeiiYiIZAj1tEVEpE9ZtmxZ6szwZoFAgDfffLOXatR3KLRFRKRPmTBhAu+9915vV6NP6jK0jTEPAucB26y17S76aoz5FnB52v6OBYqstTuNMeuAWiAOxKy1J/RUxUVERI403flM+yHgrM5WWmvvstYeZ609DrgJWGyt3ZlWZGZyvQJbRETkIHQZ2tbaJcDOrsolXQb84aBqJCIiIh3qsbPHjTE5uD3yP6YttsBLxpilxphre+q1REREjkSms0vBtSpkzHDg2Y4+004rcwlwhbX2/LRlZdbaTcaYYuBl4Ppkz72j7a8FrgUoKiqaMn/+/P1pR58TDof3eV/YTNEf2tEf2gBqR1+SSW3Iy8tj1KhRHa7riRuG9LTS0lI2b97c7fJ9sQ1dWbNmTbublsycOXNpdz5G7smzxy+lzdC4tXZT8nmbMWYBMBXoMLSttfOAeQBjxoyxlZWVPVi1w6+qqopMbwP0j3b0hzaA2tGXZFIbVq1a1en1xQ/Xtcf31/7U6VC1IRaL4fUemi9YZWVlMXny5APatkdqZIzJA2YAV6QtCwIea21tcno28MOeeD0REdl/W370I5pWtdyaMxaPs/Mge6mBY49h8M03d7r+29/+NsOGDUvdmvO2227DGMOSJUvYtWsX0WiUO+64gzlz5nT5WuFwmDlz5rTabtasWQA88sgj3H333RhjmDhxIr/73e/YunUr1113HWvXrgXg17/+NWVlZZx33nmpK6vdfffdhMNhbrvtNiorKzn11FN57bXXuOCCCzj66KO54447iEQiFBQU8Oijj1JSUkI4HOb666/nnXfewRjD97//fXbv3s3y5cv52c9+BsB///d/s2rVKu65556D+vm21Z2vfP0BqAQKjTHVwPcBH4C19v5ksQuBl6y1dWmblgALkvdH9QKPWWtf6Lmqi4hIX9eT99POyspiwYIFrbZ79913WbFiBf/5n//Ja6+9RmFhITt3uudO33DDDcyYMYMFCxYQj8cJh8Ps2rVrn6+xe/duFi9eDMCuXbt44403MMbwm9/8hjvvvJOf/vSn3H777eTl5aUuzbpr1y78fj8TJ07kzjvvxOfz8dvf/pYHHnjgYH987XQZ2tbay7pR5iHcr4alL1sLTDrQiomISM9q2yM+HMPj6ffT3r59e+p+2jfeeCNLlizB4/Gk7qc9ePDgfe7LWsvNN9/cartt27bx17/+lYsuuojCwkIA8vPzAfjrX//KI488AoDjOOTl5XUZ2pdccklqurq6mksuuYTNmzcTiUQYMWIEAAsXLuTxxx9PlRs0aBAAs2bN4tlnn+XYY48lGo0yYcKE/fxpdU1XRBMRkUOqp+6n3dl21toue+nNvF4viUQiNd/2dYPBYGr6+uuv55vf/CYXXHABVVVV3HbbbQCdvt7VV1/Nj370I4455hiuuuqqbtVnf+mGISIickhdeumlPP744zz55JNcdNFF7Nmz54Dup93ZdmeccQbz58+npqYGIDU8fsYZZ6RuwxmPx9m7dy8lJSVs27aNmpoampqaePbZZ/f5ekOGDAHg4YcfTi2fPXs2v/rVr1Lzzb33k046iQ0bNvDYY49x2WVdDlIfEIW2iIgcUh3dT/udd97hhBNO4NFHH+32/bQ7227cuHF897vfZcaMGUyaNIlvfvObAPziF79g0aJFTJgwgSlTprBi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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_learning_curves(history_selu)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "model.evaluate(x_test_scaled, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 深度可分离卷积 Separable CNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential()\n",
    "# 构建模型\n",
    "model.add(keras.layers.Conv2D(\n",
    "    filters=32, kernel_size=3, padding='same',activation='selu', input_shape=(28,28,1)))\n",
    "model.add(keras.layers.SeparableConv2D(\n",
    "    filters=32, kernel_size=3, padding='same', activation='selu'))\n",
    "model.add(keras.layers.MaxPool2D(pool_size=2))\n",
    "\n",
    "model.add(keras.layers.SeparableConv2D(\n",
    "    filters=64, kernel_size=3, padding='same', activation='selu'))\n",
    "model.add(keras.layers.SeparableConv2D(\n",
    "    filters=64, kernel_size=3, padding='same', activation='selu'))\n",
    "model.add(keras.layers.MaxPool2D(pool_size=2))\n",
    "\n",
    "model.add(keras.layers.SeparableConv2D(\n",
    "    filters=128, kernel_size=3, padding='same', activation='selu'))\n",
    "model.add(keras.layers.SeparableConv2D(\n",
    "    filters=128, kernel_size=3, padding='same', activation='selu'))\n",
    "model.add(keras.layers.MaxPool2D(pool_size=2))\n",
    "\n",
    "model.add(keras.layers.Flatten())\n",
    "model.add(keras.layers.Dense(128, activation='selu'))\n",
    "model.add(keras.layers.Dense(10, activation='softmax'))\n",
    "\n",
    "# 模型编译，固化模型\n",
    "model.compile(loss='sparse_categorical_crossentropy',\n",
    "              optimizer='adam',\n",
    "              metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d (Conv2D)              (None, 28, 28, 32)        320       \n",
      "_________________________________________________________________\n",
      "separable_conv2d (SeparableC (None, 28, 28, 32)        1344      \n",
      "_________________________________________________________________\n",
      "max_pooling2d (MaxPooling2D) (None, 14, 14, 32)        0         \n",
      "_________________________________________________________________\n",
      "separable_conv2d_1 (Separabl (None, 14, 14, 64)        2400      \n",
      "_________________________________________________________________\n",
      "separable_conv2d_2 (Separabl (None, 14, 14, 64)        4736      \n",
      "_________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2 (None, 7, 7, 64)          0         \n",
      "_________________________________________________________________\n",
      "separable_conv2d_3 (Separabl (None, 7, 7, 128)         8896      \n",
      "_________________________________________________________________\n",
      "separable_conv2d_4 (Separabl (None, 7, 7, 128)         17664     \n",
      "_________________________________________________________________\n",
      "max_pooling2d_2 (MaxPooling2 (None, 3, 3, 128)         0         \n",
      "_________________________________________________________________\n",
      "flatten (Flatten)            (None, 1152)              0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 128)               147584    \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 10)                1290      \n",
      "=================================================================\n",
      "Total params: 184,234\n",
      "Trainable params: 184,234\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/10\n",
      "55000/55000 [==============================] - 50s 911us/sample - loss: 0.5131 - accuracy: 0.8119 - val_loss: 0.3622 - val_accuracy: 0.8690\n",
      "Epoch 2/10\n",
      "55000/55000 [==============================] - 46s 832us/sample - loss: 0.3105 - accuracy: 0.8872 - val_loss: 0.2972 - val_accuracy: 0.8864\n",
      "Epoch 3/10\n",
      "55000/55000 [==============================] - 45s 821us/sample - loss: 0.2660 - accuracy: 0.9015 - val_loss: 0.2700 - val_accuracy: 0.9012\n",
      "Epoch 4/10\n",
      "55000/55000 [==============================] - 46s 827us/sample - loss: 0.2340 - accuracy: 0.9130 - val_loss: 0.2430 - val_accuracy: 0.9082\n",
      "Epoch 5/10\n",
      "55000/55000 [==============================] - 46s 836us/sample - loss: 0.2098 - accuracy: 0.9235 - val_loss: 0.2461 - val_accuracy: 0.9100\n",
      "Epoch 6/10\n",
      "55000/55000 [==============================] - 46s 837us/sample - loss: 0.1897 - accuracy: 0.9294 - val_loss: 0.2487 - val_accuracy: 0.9080\n",
      "Epoch 7/10\n",
      "55000/55000 [==============================] - 46s 831us/sample - loss: 0.1734 - accuracy: 0.9358 - val_loss: 0.2387 - val_accuracy: 0.9132\n",
      "Epoch 8/10\n",
      "55000/55000 [==============================] - 46s 835us/sample - loss: 0.1549 - accuracy: 0.9422 - val_loss: 0.2585 - val_accuracy: 0.9124\n",
      "Epoch 9/10\n",
      "55000/55000 [==============================] - 45s 826us/sample - loss: 0.1401 - accuracy: 0.9473 - val_loss: 0.2559 - val_accuracy: 0.9194\n",
      "Epoch 10/10\n",
      "55000/55000 [==============================] - 46s 840us/sample - loss: 0.1285 - accuracy: 0.9522 - val_loss: 0.3151 - val_accuracy: 0.9024\n"
     ]
    }
   ],
   "source": [
    "# 定义文件夹和文件\n",
    "logdir = os.path.join('separable-cnn-selu-models')\n",
    "if not os.path.exists(logdir):\n",
    "    os.mkdir(logdir)\n",
    "output_model_file = os.path.join(logdir,'fashion_mnist_model.h5')\n",
    "\n",
    "# 定义回调函数\n",
    "callbacks = [\n",
    "    keras.callbacks.TensorBoard(log_dir=logdir,profile_batch = 100000000),\n",
    "    keras.callbacks.ModelCheckpoint(output_model_file,save_best_only=True),\n",
    "    keras.callbacks.EarlyStopping(patience=5,min_delta=1e-3),\n",
    "]\n",
    "\n",
    "# 训练\n",
    "history_separable_cnn = model.fit(x_train_scaled,y_train,epochs=10,\n",
    "                                  validation_data=(x_valid_scaled,y_valid),\n",
    "                                  callbacks=callbacks)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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omAWERFJIgpmERGRJKJgFhERSSIKZhERkSSiYBYREUkiCmYREZEkomAWERFJIgpmERGRJKJgFhERSSIKZhERkSSiYBYREUkiCmYREZEkomAWERFJIgpmERGRJKJgFhERSSIKZhERkSSiYBYREUkiCmYREZEkomAWERFJIgpmERGRJKJgFhERSSIKZhERkSSiYBYREUkiCmYREZEkomAWERFJIgpmERGRJKJgFhERSSIKZhERkSSiYBYREUkiCmYREZEkomAWERFJIgpmERGRJKJgFhERSSIKZhERkSSiYBYREUkiCmYREZEkomAWERFJIgMKZmPM2caYz4wxG4wx3++jTJkxZrUxZo0x5vXBraaIiMjhwdVfAWOME3gYOAPYCqwwxrxorf00rsww4NfA2dbazcaYooNVYRERkVQ2kB7zHGCDtbbCWtsOPAtc2K3MN4HnrbWbAay1uwe3miIiIoeHgQTzSGBL3Put0WXxJgK5xphyY8wqY8y3BquCIiIihxNjrd17AWMuAc6y1l4XfX8lMMdae2tcmV8BxwGnAenA28B8a+36bvu6AbgBoLCwcNaiRYsGsSmJ0dTUhM/nS3Q1DkgqtAHUjmSSCm2A1GhHKrQBUqcd8+bNW2WtPW5vZfo9x0ykhzw67v0oYHsvZaqttc1AszFmOTAD6BLM1tpHgUcBJk2aZMvKygbw8cmtvLycod6OVGgDqB3JJBXaAKnRjlRoA6ROOwZiIIeyVwATjDHjjDFpwGXAi93K/AU42RjjMsZkAMcDawe3qiIiIqmv3x6ztTZojLkFeBVwAo9ba9cYY26Mrl9orV1rjHkF+AgIA49Zaz85mBUXERFJRQM5lI219mXg5W7LFnZ7/wDwwOBVTURE5PCjkb9ERESSiIJZREQkiSiYRUREkoiCWUREJIkomEVERJKIgllERCSJKJhFRESSiIJZREQkiSiYRUREkoiCWUREJIkomEVERJKIgllERCSJKJhFRESSiIJZREQkiSiYRUREkoiCWUREJIkomEVERJJIwoK5sd0m6qNFRESSVsKCucZv+fOqrYn6eBERkaSUsGD2OuHOP39E+We7E1UFERGRpJOwYC7KcDCpJIubnn6f1Vv2JKoaIiIiSSVhweww8MTVsynISuOaJ1dQUdWUqKqIiIgkjYRelV2U5eWpa47HAN96/D12N/gTWR0R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6jEfoDVr1nDjjTd2WebxeHj33YGM7yIiItKVgvkATZ06ldWrVye6GiIikiJ0KFtERCSJKJhFRESSiIJZREQkiSiYRUREkoiC+QD4fL5EV0FERFKMgjkFBIPBRFdBREQGSdLeLrXzZz+jbe3gPo/Zc9RkSu6+u8/1g/k85qamJi688MJet3vqqad48MEHMcYwffp0fv/737Nr1y5uvPFGKioqAHjkkUcYMWIE5513XmwEsQcffJCmpibuvfdeysrK+PKXv8xbb73FBRdcwMSJE7nvvvtob28nPz+fZ555huLiYpqamrj11ltZuXIlxhjuuece9uzZwyeffMJ//ud/AvDkk0+yceNGfvGLXxzQz1dERA5c0gZzIgzm85i9Xi8vvPBCj+0+/fRTfvrTn/LWW29RUFBAbW0tALfddhunnHIKL7zwAqFQiKamJurq6vb6GXv27OH1118HoK6ujnfeeQdjDI899hj3338/Dz30ED/5yU/IycmJDTNaV1dHWloa06dP5/7778ftdvP000/z2GOPHeiPT0REBkHSBvPeerYHy2A+j9lay913391ju9dee42LL76YgoICAPLy8gB47bXXeOqppwBwOp3k5OT0G8yXXnppbH7r1q1ceuml7Nixg/b2dsaNGwfA0qVLefbZZ2PlcnNzATj11FN56aWXOOqoowgEAkybNm0ff1oiInIwJG0wJ0rH85h37tzZ43nMbrebsWPHDuh5zH1tZ63tt7fdweVyEQ6HY++7f25mZmZs/tZbb+W73/0uF1xwAeXl5dx7770AfX7eddddx89+9jMmT57MFVdcMaD6iIjIwaeLv7q57LLLePbZZ3nuuee4+OKLqa+v36/nMfe13WmnncaiRYuoqakBiB3KPu2002KPeAyFQjQ0NFBcXMzu3bupqamhra2Nl156aa+fN3LkSAB+97vfxZafeeaZ/OpXv4q97+iFH3/88WzZsoU//OEPXHzxxQP98YiIyEGmYO6mt+cxr1y5kuOOO45nnnlmwM9j7mu7qVOn8oMf/IBTTjmFGTNm8N3vfheAX/7ylyxbtoxp06Yxa9Ys1qxZg9vt5sc//jHHH38855133l4/+9577+WSSy7h5JNPjh0mB/jhD39IXV0dRx99NDNmzGDZsmWxdV//+tc58cQTY4e3RUQk8XQouxeD8TzmvW23YMECFixY0GVZ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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_learning_curves(history):\n",
    "    pd.DataFrame(history.history).plot(figsize=(8,5))\n",
    "    plt.grid(True)\n",
    "    plt.gca().set_ylim(0, 1)\n",
    "    plt.show()\n",
    "\n",
    "plot_learning_curves(history_separable_cnn)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "model.evaluate(x_test_scaled, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
